package com.jml.task.lock.impl;

import com.jml.task.LockContext;
import com.jml.task.lock.Lock;
import com.jml.task.utils.ZkClientUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;


@Slf4j
public abstract class ZookeeperAbstractTemplateLock implements Lock {

    @Value("${server.port}")
    private String serverPort;

    /**
     * 模板方法设计模式 定义共同业务逻辑的骨架，不同的算法交给子类实现。
     */
    @Override
    public void getLock() {
        // 调用tryLock方法获取锁
        if (tryLock()) {
            log.info(">>>[{}]获取锁成功<<", serverPort);
        } else {
            // 获取锁失败 当前的线程阻塞
            waitLock();
            //唤醒之后从新进入到获取锁的状态
            getLock();
        }
    }

    protected abstract void waitLock();

    protected abstract boolean tryLock();

    @Override
    public void unLock() {
        // 关闭连接 释放锁
//        ZkClient zkClient = ZkClientUtils.getZkClient()
        // 分布式锁框架 zk框架 周一公开课 顺便：分布式锁框架源码解读： 周二：redis实现分布式锁
//        if (zkClient != null) {
//            zkClient.delete("/lockPath");
        ZkClientUtils.close();
        LockContext.remove();
//        }
        log.info(">>>[{}]释放锁成功<<", serverPort);
    }
//
//    @Override
//    public void getLock() {
//        // 调用tryLock方法获取锁
//        for (int i = 0; i < 5; i++) {
//            boolean result = tryLock();
//            if (result) {
//                log.info(">>>[{}]获取锁成功<<", serverPort);
//                return;
//            }
//            // 30s  60s  70 s
//            // 续命
//        }
//        // 获取锁失败 当前的线程阻塞
//        waitLock();
//        //唤醒之后从新进入到获取锁的状态
//        getLock();
//    }


}
